package entity;

import constant.UiConstant;

import java.awt.*;

public class Toast {
    private final long MESSAGE_DURATION = 2000; // 消息显示持续时间（毫秒）
    // 消息提示相关属性
    private boolean isShowMessage = false; // 是否显示等级提升消息
    private String message = "";         // 消息内容
    private long messageStartTime = 0;          // 消息开始显示的时间
    // 消息动画相关
    private float messageAlpha = 0.0f;          // 透明度（用于淡入淡出）
    private int messageYOffset = 0;             // Y轴偏移（用于动画）

    public void showMessage(String message) {
        this.isShowMessage = true;
        this.message = message;
        this.messageStartTime = System.currentTimeMillis();
        this.messageAlpha = 0.0f;    // 初始透明度
        this.messageYOffset = 20;    // 初始位置偏移
    }

    /**
     * 绘制等级提升消息（带有淡入淡出和上浮动画）
     */
    public void drawLevelUpMessage(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;

        // 计算消息显示的时间进度（0.0 - 1.0）
        long elapsedTime = System.currentTimeMillis() - messageStartTime;
        float progress = (float) elapsedTime / MESSAGE_DURATION;

        // 如果消息显示时间结束，隐藏消息
        if (progress >= 1.0f) {
            isShowMessage = false;
            return;
        }

        // 计算透明度（淡入淡出效果）
        if (progress < 0.2f) {
            // 淡入阶段
            messageAlpha = progress / 0.2f;
        } else if (progress > 0.8f) {
            // 淡出阶段
            messageAlpha = (1.0f - progress) / 0.2f;
        } else {
            // 完全显示阶段
            messageAlpha = 1.0f;
        }

        // 计算Y轴偏移（上浮效果）
        messageYOffset = (int) (20 * (1 - progress));

        // 设置字体
        Font originalFont = g2d.getFont();
        Font messageFont = new Font("微软雅黑", Font.BOLD, 28);
        g2d.setFont(messageFont);

        // 计算文本位置（屏幕中央偏上）
        FontMetrics fm = g2d.getFontMetrics();
        int textWidth = fm.stringWidth(message);
        int x = (UiConstant.APP_WIDTH - textWidth) / 2;
        int y = UiConstant.APP_HEIGHT / 3 - messageYOffset;

        // 保存原始合成设置
        Composite originalComposite = g2d.getComposite();

        try {
            // 设置透明度
            AlphaComposite alphaComp = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, messageAlpha);
            g2d.setComposite(alphaComp);

            // 绘制文字阴影（增强可读性）
            g2d.setColor(new Color(0, 0, 0, 150));
            g2d.drawString(message, x + 2, y + 2);

            // 绘制主要文字（金色渐变）
            GradientPaint gradient = new GradientPaint(
                    x, y, new Color(255, 215, 0), // 金色
                    x, y + 30, new Color(255, 165, 0) // 橙金色
            );
            g2d.setPaint(gradient);
            g2d.drawString(message, x, y);

            // 添加一些装饰效果
            if (messageAlpha > 0.8f) {
                // 只在完全显示时绘制闪烁效果
                drawSparkleEffects(g2d, x, y, textWidth, elapsedTime);
            }

        } finally {
            // 恢复原始设置
            g2d.setComposite(originalComposite);
            g2d.setFont(originalFont);
        }
    }

    /**
     * 绘制闪烁的装饰效果
     */
    public void drawSparkleEffects(Graphics2D g2d, int x, int y, int textWidth, long elapsedTime) {
        g2d.setColor(Color.YELLOW);

        // 绘制文字周围的闪烁点
        int sparkleCount = 5;
        for (int i = 0; i < sparkleCount; i++) {
            double angle = 2 * Math.PI * i / sparkleCount + elapsedTime * 0.002;
            int sparkleX = x + textWidth / 2 + (int) (Math.cos(angle) * ((double) textWidth / 2 + 20));
            int sparkleY = y - 10 + (int) (Math.sin(angle) * 20);

            // 绘制小星星
            g2d.fillRect(sparkleX, sparkleY, 2, 2);
        }
    }

    public boolean isShowMessage() {
        return isShowMessage;
    }

    public void setShowMessage(boolean showMessage) {
        isShowMessage = showMessage;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public long getMessageStartTime() {
        return messageStartTime;
    }

    public void setMessageStartTime(long messageStartTime) {
        this.messageStartTime = messageStartTime;
    }

    public long getMESSAGE_DURATION() {
        return MESSAGE_DURATION;
    }

    public float getMessageAlpha() {
        return messageAlpha;
    }

    public void setMessageAlpha(float messageAlpha) {
        this.messageAlpha = messageAlpha;
    }

    public int getMessageYOffset() {
        return messageYOffset;
    }

    public void setMessageYOffset(int messageYOffset) {
        this.messageYOffset = messageYOffset;
    }
}